/*
 * sheet.h
 *
 *  Created on: 2016年8月7日
 *      Author: pengzhikang
 */

#ifndef _SHEET_H
#define _SHEET_H  1

#include "memory.h"
#include "mtask.h"

/**
 * 最大图层数
 */
#define MAX_SHEETS 256
#define SHEET_USE 1
#define SHEET_NOT_USE 0

/**
 *    用来记录单个图层的信息
 *  buf	是记录图层上所描画内容的地址
 *  bxsize, bysize	图层的行数和列数
 *  vx0, vy0			图层在画面上的位置
 *  col_inv			图层的透明色色号 (所谓的图层的透明色:以鼠标图层为例,在HariMain函数中分别有以下两条调用语句
 *									  sheet_setbuf(sht_mouse, buf_mouse, 16, 16, 99);		设置鼠标图层信息
 *									  init_mouse_cursor8(buf_mouse, 99);		 			初始化鼠标图形
 *									  sheet_setbuf的最后一个参数99就是设置了鼠标图层的col_inv成员变量 即透明色
 *									  而init_mouse_cursor8中的参数99设置了鼠标图形中需显示背景的部分的色号,具体
 *									  请参考该函数的定义,在描绘鼠标图形的矩形中不是鼠标形状的部分即使用该色号
 *									  也就是说凡是色号为99的部分都不需要重新描绘)
 *  height			图层的高度
 *  flags			记录图层各种状态信息
 */
struct SHEET {
	unsigned char *buf;
	int bxsize, bysize, vx0, vy0, col_inv, height, flags;
	struct SHTCTL *ctl;
	struct TASK *task;
};

/**
 * vram		图像缓冲区首地址
 * xsize, ysize		分辨率的x和y	与BOOTINFO中的值相同
 * top 最上面图层的高度
 * sheets	图层指针数组, 指向sheets0中各个图层
 * sheets0	图层数组, 存放各个图层结构
 */
struct SHTCTL {
	unsigned char *vram, *map;
	int xsize, ysize, top;
	struct SHEET *sheets[MAX_SHEETS];
	struct SHEET sheets0[MAX_SHEETS];
};

struct SHTCTL *shtctl_init(struct MEMMAN *memman, unsigned char *vram, int xsize, int ysize);
struct SHEET *sheet_alloc(struct SHTCTL *ctl);
void sheet_setbuf(struct SHEET *sht, unsigned char *buf, int xsize, int ysize, int col_inv);
void sheet_refresh(struct SHEET *sht, int bx0, int by0, int bx1, int by1);
void sheet_refreshsub(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0, int h1);
void sheet_refreshmap(struct SHTCTL *ctl, int vx0, int vy0, int vx1, int vy1, int h0);
void sheet_all_refresh(struct SHTCTL *ctl);
void sheet_updown(struct SHEET *sht, int height);
void sheet_slide(struct SHEET *sht, int vx0, int vy0);
void sheet_free(struct SHEET *sht);

#endif
